package homework02;

import java.util.Scanner;

/**
 * 作业2：编程实现控制台版并支持两人对战的五子棋游戏
 * （1）绘制棋盘 - 写一个成员方法实现
 * （2）提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现
 * （3）每当一方下棋后判断是否获胜 - 写一个成员方法实现
 * （4）提示： 采用二维数组来模拟并描述棋盘，棋盘如下：
 *    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
 * 0  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * 1  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * 2  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * 3  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * 4  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * 5  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * 6  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * 7  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * 8  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * 9  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * a  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * b  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * c  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * d  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * e  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 * f  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +
 */
public class GameFiveChess {
    private final int[][] arr = new int[16][16];   //定义棋盘数组
    private final Scanner sc = new Scanner(System.in);     //声明扫描器获取棋子坐标
    private int x;            //声明成员方法，棋子坐标x轴
    private int y;            //声明成员方法，棋子坐标y轴


    public int[][] getArr() {
        return arr;
    }

    public void setArr(int value) {
        if (arr[getX()][getY()] == 0) {
            arr[getX()][getY()] = value;
        } else if (arr[getX()][getY()] == 1) {
            System.out.println("该位置已经落黑子了哦！");
            if (value == 1) {
                play("黑");
            } else {
                play("白");
            }
        } else if (arr[getX()][getY()] == 2) {
            System.out.println("该位置已经落白子了哦！");
            if (value == 1) {
                play("黑");
            } else {
                play("白");
            }
        }

    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        if (0 <= x && x <= 15) {
            this.x = x;
        } else {
            System.out.println("横坐标值不合理。。。");
            System.out.println("请重新输入：");
            setX(sc.nextInt());
        }

    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        if (0 <= y && y <= 15) {
            this.y = y;
        } else {
            System.out.println("纵坐标值不合理哦。。。");
            System.out.println("请重新输入：");
            setY(sc.nextInt());
        }
    }

    // 绘制棋盘
    public void draw() {
        // 外层循环打印行
        System.out.println("---------------------绘制棋盘-----------------------------");
        for (int i = 0; i < 17; i++) {
            // 内层循环打印列
            for (int j = 0; j < 17; j++) {
                if (i == 0 && j == 0) {
                    System.out.print("   ");
                } else if (i == 0) {
                    // 行为零时，打印棋盘列标识
                    System.out.printf("%x  ", j - 1);
                } else if (j == 0) {
                    // 列为零时，打印棋盘行标识
                    System.out.printf("%x  ", i - 1);
                } else {
                    // 绘制棋盘棋子
                    int location = getArr()[i - 1][j - 1];
                    if (location == 1) {
                        System.out.print("@  ");
                    } else if (location == 2) {
                        System.out.print("O  ");
                    } else {
                        System.out.print("+  ");
                    }
                }
            }
            // 一行打印完，换行
            System.out.println();
        }
        System.out.println("------------------------绘制成功--------------------------");
    }

    // 提示黑方和白方分别下棋
    public void play(String rights) {
        if (rights.equals("黑")) {
            System.out.println("请输入黑色棋子横坐标(范围：0~15)：");
            setX(sc.nextInt());
            System.out.println("请输入黑色棋子纵坐标(范围：0~15)：");
            setY(sc.nextInt());
            setArr(1);   // 黑子为1
        } else if (rights.equals("白")) {
            System.out.println("请输入白色棋子横坐标(范围：0~15)：");
            setX(sc.nextInt());
            System.out.println("请输入白色棋子纵坐标(范围：0~15)：");
            setY(sc.nextInt());
            setArr(2);   // 白子为2
        }
    }

    private int up_down() {
        //计算是否有连成5子
        int sum = 1;   // 存放连几子
        int up = 1;
        int down = 1;
        //计算列上是否胜利
        while (sum != 5) {
            // 处理数组越界异常
            if (x - up >= 0) {
                if (getArr()[x][y] == getArr()[x - up][y]) {
                    sum += 1;
                    up++;
                } else if (x + down <= 15) {
                    if (getArr()[x][y] == getArr()[x + down][y]) {
                        sum += 1;
                        down++;
                    } else {
                        break;
                    }
                } else {
                    break;
                }
            } else if (x + down <= 15) {
                if (getArr()[x][y] == getArr()[x + down][y]) {
                    sum += 1;
                    down++;
                } else {
                    break;
                }
            } else {
                break;
            }
        }

        return sum;
    }

    private int left_right() {
        int sum = 1;   // 存放连几子
        int left = 1;
        int right = 1;
        //计算行是否有连子
        while (sum != 5) {
            // 处理数组越界异常
            if (y - left >= 0) {
                if (getArr()[x][y] == getArr()[x][y - left]) {
                    sum += 1;
                    left++;
                } else if (y + right <= 15) {
                    if (getArr()[x][y] == getArr()[x][y + right]) {
                        sum += 1;
                        right++;
                    } else {
                        break;
                    }
                } else {
                    break;
                }
            } else if (y + right <= 15) {
                if (getArr()[x][y] == getArr()[x][y + right]) {
                    sum += 1;
                    right++;
                } else {
                    break;
                }
            } else {
                break;
            }
        }
        return sum;
    }

    private int left_up_to_right_down() {
        int sum = 1;   // 存放连几子
        int left_up = 1;
        int right_down = 1;
        // 计算左上到右下
        while (sum != 5) {
            // 处理数组越界异常
            if (y - left_up >= 0 && x - left_up >= 0) {
                if (getArr()[x][y] == getArr()[x - left_up][y - left_up]) {
                    sum += 1;
                    left_up++;
                } else if (y + right_down <= 15 && x + right_down <= 15) {
                    if (getArr()[x][y] == getArr()[x + right_down][y + right_down]) {
                        sum += 1;
                        right_down++;
                    } else {
                        break;
                    }
                } else {
                    break;
                }
            } else if (y + right_down <= 15 && x + right_down <= 15) {
                if (getArr()[x][y] == getArr()[x + right_down][y + right_down]) {
                    sum += 1;
                    right_down++;
                } else {
                    break;
                }
            } else {
                break;
            }
        }
        return sum;
    }

    private int left_down_to_right_up() {
        int sum = 1;   // 存放连几子
        int left_down = 1;
        int right_up = 1;
        // 计算左下到右上
        while (sum != 5) {
            // 处理数组越界异常
            if (y - left_down >= 0 && x + left_down <= 15) {
                if (getArr()[x][y] == getArr()[x + left_down][y - left_down]) {
                    sum += 1;
                    left_down++;
                } else if (y + right_up <= 15 && x - right_up >= 0) {
                    if (getArr()[x][y] == getArr()[x - right_up][y + right_up]) {
                        sum += 1;
                        right_up++;
                    } else {
                        break;
                    }
                } else {
                    break;
                }
            } else if (y + right_up <= 15 && x - right_up >= 0) {
                if (getArr()[x][y] == getArr()[x - right_up][y + right_up]) {
                    sum += 1;
                    right_up++;
                } else {
                    break;
                }
            } else {
                break;
            }
        }
        return sum;
    }

    // 下棋之后判断输赢
    public boolean success() {
        return up_down() == 5 || left_right() == 5 || left_down_to_right_up() == 5 || left_up_to_right_down() == 5;
    }

}
